﻿/*
合法字符串 
Time Limit:1000MS  Memory Limit:65536K

  
Description:
一个合法的字符串是指最少含有一个元音字符和两个辅音字符的字符串。
元音字符包括六个（a、o、e、i、u），其它小写字母都是辅音字符。
现给你由多个小写字母组成的字符表，要你按字典序输出由这些字符表里的字母组成的所有长度为L的合法字符串。
注：一个字符串里每个字母最多只能出现一次。

Input:
输入包含多组测试数据。每组测试数据的第一行包含两个整数L、C，分别表示合法字符串的长度和给定的字符表里的字母个数。
3<=L<=15,L<=C<=26。 
Output:
针对每组测试数据，按字典序输出所有长度为L的合法字符串。 
Sample Input:
4 6
a t c i s w
Sample Output:
acis
acit
aciw
acst
acsw
actw
aist
aisw
aitw
astw
cist
cisw
citw
istw
*/
#include <stdio.h>
#include <stdlib.h>
#define LOOP 1
int compare(const void* a, const void* b)
{
	return (*(char *) a - *(char *) b);
}
bool vowels[] =
{
	true, false, false, false, true, false, false, false, true, false, false,
	false, false, false, true, false, false, false, false, false, true, false,
	false, false, false, false
};
bool is_valid(char chars[], int subs[], int L)
{
	unsigned vowel = 0u;
	for (int i = 1; i <= L; ++i)
		if (vowels[chars[subs[i]] - 'a'])
			++vowel;
	if (vowel < 1u)
		return false;
	return (L - vowel) >= 2u;
}
int main(int argc, char* argv[])
{
	int subs[27];
	int L, C;

	while (EOF != scanf("%d%d", &L, &C))
	{
		int p = L;
		char chars[27];
		{
			for (int i = 1; i <= L; ++i)
				subs[i] = i;
		}
		{
			char tmp[2];
			int i;
			for (i = 1; i <= C; ++i)
			{
				scanf("%s", tmp);
				chars[i] = tmp[0];
			}

			qsort(chars, C, sizeof(char), compare);

			if (is_valid(chars, subs, L))
			{
				for (i = 1; i <= L; ++i)
					printf("%c", chars[subs[i]]);
				printf("\n");
			}
		}

		while (LOOP)
		{
			int i;

			if (C == subs[L])
				--p;
			else
				p = L;
			++subs[p];
			{
				for (i = p + 1; i <= L; ++i)
					subs[i] = subs[i - 1] + 1;
			}

			if (is_valid(chars, subs, L))
			{
				for (i = 1; i <= L; ++i)
					printf("%c", chars[subs[i]]);
				printf("\n");
			}

			if (subs[1] > (C - L))
				break;
		}
	}

	return 0;
}